/**
  ******************************************************************************
  * @file   app_fee_strategy.h
  * @author leven
  * @brief  v2.2
  ******************************************************************************
  */

#ifndef __APP_FEE_STRATEGY_H
#define __APP_FEE_STRATEGY_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

#define FEE_STRATEGY_DEBUG   0
#define FEE_STRATEGY_ERROR   0xFFFFFFFF

#define FEE_MAX_PORT_NUM     2 /* 充电接口数量/计量用电能表数量 */

/* 充电接口编号/计量用电能表编号 */
enum fee_number {
    FEE_NUMBERA = 0x00,
    FEE_NUMBERB,
};

/**
 * 00:00 ~ 00:29
 * 00:30 ~ 00:59
 * ...
 * 23:00 ~ 23:29
 * 23:30 ~ 23:59
 */
#define FEE_STRATEGY_PERIOD_TPYE_MAX  48

enum fee_strategy_price_type {
    FEE_STRATEGY_PRICE_TPYE_SHARP = 0x00, /* 尖 */
    FEE_STRATEGY_PRICE_TPYE_PEAK,         /* 峰 */
    FEE_STRATEGY_PRICE_TPYE_FLAT,         /* 平 */
    FEE_STRATEGY_PRICE_TPYE_VALLEY,       /* 谷 */
    FEE_STRATEGY_PRICE_TPYE_MAX,
};

uint64_t get_fi_start_time(enum fee_number no);
uint64_t get_fi_end_time(enum fee_number no);
/** 获取总的充电时间 (单位：秒) */
uint64_t get_fi_total_time(enum fee_number no);

uint32_t get_fi_start_elect(enum fee_number no);
uint32_t get_fi_end_elect(enum fee_number no);
/** 获取总的充电电量 (精确到4位有效小数) */
uint32_t get_fi_total_elect(enum fee_number no);

/** 获取总的充电电费 (精确到4位有效小数) */
uint32_t get_fi_total_elec_fee(enum fee_number no);
/** 获取总的充电服务费 (精确到4位有效小数) */
uint32_t get_fi_total_service_fee(enum fee_number no);

/** 获取尖峰平谷 @type 对应的电费 (精确到4位有效小数) */
uint32_t get_fi_price_elec_fee(enum fee_number no, enum fee_strategy_price_type type);
/** 获取尖峰平谷 @type 对应的服务费 (精确到4位有效小数) */
uint32_t get_fi_price_service_fee(enum fee_number no, enum fee_strategy_price_type type);
/** 获取尖峰平谷 @type 对应的电量 (精确到4位有效小数) */
uint32_t get_fi_price_elect(enum fee_number no, enum fee_strategy_price_type type);

/** 获取时段 @period 的电量 (精确到4位有效小数) */
uint32_t get_fi_period_elect(enum fee_number no, uint8_t period);

/** 设置尖峰平谷 @type 对应的电费价格 @fee (精确到4位有效小数) */
void set_fi_price_elec(enum fee_number no, enum fee_strategy_price_type type, uint32_t fee);
/** 设置尖峰平谷 @type 对应的服务费价格 @fee (精确到4位有效小数) */
void set_fi_price_service(enum fee_number no, enum fee_strategy_price_type type, uint32_t fee);

/** 获取尖峰平谷 @type 对应的电费价格 (精确到4位有效小数) */
uint32_t get_fi_price_elec(enum fee_number no, enum fee_strategy_price_type type);
/** 获取尖峰平谷 @type 对应的服务费价格 (精确到4位有效小数) */
uint32_t get_fi_price_service(enum fee_number no, enum fee_strategy_price_type type);

/** 设置每个时段 @period 的电费价格对应尖峰平谷 @type 中的哪一种 */
void set_fi_period_elec_type(enum fee_number no, uint8_t period, enum fee_strategy_price_type type);
/** 设置每个时段 @period 的服务费价格对应尖峰平谷 @type 中的哪一种 */
void set_fi_period_service_type(enum fee_number no, uint8_t period, enum fee_strategy_price_type type);

/**
 * @brief 初始化费率计算
 * @param no 充电接口编号/计量用电能表编号
 * @param curr_time 当前时间（单位：秒）
 * @param curr_elect 当前电量 (精确到3位有效小数)
 */
void fi_init(enum fee_number no, uint64_t curr_time, uint32_t curr_elect);
/**
 * @brief 费率计算
 * @param no 充电接口编号/计量用电能表编号
 * @param curr_time 当前时间（单位：秒）
 * @param curr_elect 当前电量 (精确到3位有效小数)
 */
void fi_calculate(enum fee_number no, uint64_t curr_time, uint32_t curr_elect);

#ifdef __cplusplus
}
#endif

#endif

/*****************************(C)COPYRIGHT(c) 2021 Thaisen *****END OF FILE****/
